/*						-*- coding: utf-8 -*-
 * tokenize.h			-- shell tokenizer
 * 
 *           Author: Erick Gallesio [eg@unice.fr]
 *    Creation date: 22-May-2010 08:39 (eg)
 * Last file update: 22-May-2010 17:58 (eg)
 */

#ifndef TOKENIZE_H
#  define TOKENIZE_H

#define MAX_TOKEN 500	/* taille max d'un "mot" renvoyé par get_token */

enum token_type { item, less, greater, append, semicolon, pip, amper, eol,
		  error };


struct token {
  enum token_type type; 
  char *content; 	/* content ne sert que quand type = item ou error */
}; 

/* Trouver le prochain token dans line 
 * Cette  fonction a un comportement proche de celui de la fonction 
 * standard strtok:
 *     - quand la fonction est appelée avec line non NULL, on renvoie 
 *       le premier token de line.
 *     - quand line est NULL, on continue de là où l'on s'était arrêté 
 *       précédemment (i.e. on renvoie le token suivant). 
 */
struct token *get_token(char *line);


/* Notes: 
 *     - Type de token renvoyé:
 *         '<'	           less
 *	   '>'	           greater
 *	   '>>'	           append
 *	   ';'	           semicolon
 *	   '|'	           pip
 *	   '&'	           amp
 *         fin de ligne    eol
 *	   autre           item (et dans ce cas 'content' contient 
 *                               la valeur de l'item)
 *	  
 *     - get_token saute les commentaires (de # à la fin de la ligne)
 *     - Quand on rencontre une variable ($XYZ) on renvoie sa valeur 
 *     - get_token reconnait les chaînes entre simples quotes ou guillemets
 *     - Il n'y a pas d'évaluation des variables dans les chaînes (même 
 *       celles avec des guillemets (contrairement aux shells classiques)
 *     - le caractère \ peut être utilisé dans une chaine pour protéger un 
 *       guillemet ou une quote
 *     - en cas  d'erreur (typiquement une chaîne non terminée sur fin de ligne
 *       le type du token est "error" et "content" contient un message d'erreur 
 */
#endif
